package main

import (
	"context"
	"fmt"
	"sync"
	"time"
)

type CCLMapDate struct {
	Rid int32
}

type MessageInfo struct {
	Rid int32
}


//func main() {
//	var messageList []CCLMapDate
//
//	MessageInfos := make([]MessageInfo, 0)
//
//	for _, val := range MessageInfos {
//		messageList = append(messageList, CCLMapDate{
//			Rid: val.Rid, //
//		})
//	}
//	fmt.Println(messageList)
//}

//func main() {
//	// 合起来写
//	go func() {
//		i := 0
//		for {
//			i++
//			fmt.Printf("new goroutine: i = %d\n", i)
//			time.Sleep(time.Second)
//		}
//	}()
//	i := 0
//	for {
//		i++
//		fmt.Printf("main goroutine: i = %d\n", i)
//		time.Sleep(time.Second)
//		if i == 2 {
//			break
//		}
//	}
//}
//func a() {
//	for i := 1; i < 10; i++ {
//		fmt.Println("A:", i)
//	}
//}
//
//func b() {
//	for i := 1; i < 10; i++ {
//		fmt.Println("B:", i)
//	}
//}
//
//func main() {
//	runtime.GOMAXPROCS(2)
//	go a()
//	runtime.Gosched()
//	go b()
//	time.Sleep(time.Second)
//}

//func a() {
//	for i := 1; i < 10; i++ {
//		fmt.Println("A:", i)
//		//time.Sleep(time.Second)
//	}
//}
//
//func b() {
//	for i := 1; i < 10; i++ {
//		fmt.Println("B:", i)
//	}
//}
//
//func c() {
//	for i := 1; i < 10; i++ {
//		fmt.Println("C:", i)
//	}
//}
//
//func main() {
//	runtime.GOMAXPROCS(1)
//	go b()
//	go a()
//	go c()
//	time.Sleep(time.Second)
//}
// 判断管道有没有存满
//func main() {
//	// 创建管道
//	output1 := make(chan string, 10)
//	// 子协程写数据
//	go write(output1)
//	// 取数据
//	for s := range output1 {
//		fmt.Println("res:", s)
//		time.Sleep(time.Second)
//	}
//}
//
//func write(ch chan string) {
//	for {
//		select {
//		// 写数据
//		case ch <- "hello":
//			fmt.Println("write hello")
//		default:
//			fmt.Println("channel full")
//		}
//		time.Sleep(time.Millisecond * 500)
//	}
//}
//var (
//	x      int64
//	wg     sync.WaitGroup
//	lock   sync.Mutex
//	rwlock sync.RWMutex
//)
//
//func write() {
//	//lock.Lock()   // 加互斥锁
//	rwlock.Lock() // 加写锁
//	x = x + 1
//	time.Sleep(10 * time.Millisecond) // 假设读操作耗时10毫秒
//	rwlock.Unlock()                   // 解写锁
//	//lock.Unlock()                     // 解互斥锁
//	wg.Done()
//}
//
//func read() {
//	//lock.Lock()                  // 加互斥锁
//	rwlock.RLock()               // 加读锁
//	time.Sleep(time.Millisecond) // 假设读操作耗时1毫秒
//	rwlock.RUnlock()             // 解读锁
//	//lock.Unlock()                // 解互斥锁
//	wg.Done()
//}
//
//func main() {
//	start := time.Now()
//	for i := 0; i < 10; i++ {
//		wg.Add(1)
//		go write()
//	}
//
//	for i := 0; i < 1000; i++ {
//		wg.Add(1)
//		go read()
//	}
//
//	wg.Wait()
//	end := time.Now()
//	fmt.Println(end.Sub(start))
//}

//var wg sync.WaitGroup
//
//func worker(ctx context.Context) {
//	go worker2(ctx)
//LOOP:
//	for {
//		fmt.Println("worker")
//		time.Sleep(time.Second)
//		select {
//		case <-ctx.Done(): // 等待上级通知
//			break LOOP
//		default:
//		}
//	}
//	wg.Done()
//}
//
//func worker2(ctx context.Context) {
//LOOP:
//	for {
//		fmt.Println("worker2")
//		time.Sleep(time.Second)
//		select {
//		case <-ctx.Done(): // 等待上级通知
//			break LOOP
//		default:
//		}
//	}
//}
//func main() {
//	ctx, cancel := context.WithCancel(context.Background())
//	wg.Add(1)
//	go worker(ctx)
//	time.Sleep(time.Second * 3)
//	cancel() // 通知子goroutine结束
//	wg.Wait()
//	fmt.Println("over")
//}

//func gen(ctx context.Context) <-chan int {
//	dst := make(chan int)
//	n := 1
//	go func() {
//		for {
//			select {
//			case <-ctx.Done():
//				return // return结束该goroutine，防止泄露
//			case dst <- n:
//				n++
//			}
//		}
//	}()
//	return dst
//}
//func main() {
//	ctx, cancel := context.WithCancel(context.Background())
//	defer cancel() // 当我们取完需要的整数后调用cancel
//
//	for n := range gen(ctx) {
//		fmt.Println(n)
//		if n == 5 {
//			break
//		}
//	}
//}

//func main() {
//	d := time.Now().Add(50 * time.Millisecond)
//	ctx, cancel := context.WithDeadline(context.Background(), d)
//
//	// 尽管ctx会过期，但在任何情况下调用它的cancel函数都是很好的实践。
//	// 如果不这样做，可能会使上下文及其父类存活的时间超过必要的时间。
//	defer cancel()
//
//	select {
//	case <-time.After(1 * time.Second):
//		fmt.Println("overslept")
//	case <-ctx.Done():
//		fmt.Println(ctx.Err())
//	}
//}
//func main() {
//	cc :=make(chan int)
//	go func() {
//		time.Sleep(3*time.Second)
//		fmt.Println(<-cc)
//cc <- 10
//fmt.Println("111")
//}()
//time.Sleep(3*time.Second)
//cc <- 1
//time.Sleep(1*time.Second)
//fmt.Println("222",<-cc)
//close(cc)
//}
var wg sync.WaitGroup

func worker(ctx context.Context) {
LOOP:
	for {
		fmt.Println("db connecting ...")
		time.Sleep(time.Millisecond * 10) // 假设正常连接数据库耗时10毫秒
		select {
		case <-ctx.Done(): // 50毫秒后自动调用
			break LOOP
		default:
		}
	}
	fmt.Println("worker done!")
	wg.Done()
}

func main() {
	// 设置一个50毫秒的超时
	ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*50)
	wg.Add(1)
	go worker(ctx)
	time.Sleep(time.Second * 5)
	cancel() // 通知子goroutine结束
	wg.Wait()
	fmt.Println("over")
}
